package s2elinshu;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.Scanner;

import s2elinshu.model.SungJuk2VO;

public class J22SungJuk {
	// 성적 처리를 JDBC로 구현
	// 오라클 데이터베이스를 이용해서
	// 성적 데이터 저장, 조회, 수정, 삭제를 처리

	// JDBC 객체 및 연결정보
	private static String DRV = "oracle.jdbc.driver.OracleDriver";
	private static String URL = "jdbc:oracle:thin:@112.216.253.124:1521:xe";
	private static String USR = "s2elinshu";
	private static String PWD = "s2elinshu";

	public static void main(String[] args) {
	  Scanner sc = null; 
	  String result = "";
		while(true){
					System.out.println("JDBC 성적 처리 프로그램 V1");
					System.out.println("===================================");
					System.out.println("1: 새로운 성적 데이터 추가");
					System.out.println("2: 전체 성적 데이터 출력");
					System.out.println("3: 성적 데이터 조회");
					System.out.println("4: 성적 데이터 수정");
					System.out.println("5: 성적 데이터 삭제");
					System.out.println("0: 프로그램 종료");
					System.out.println("===================================");
					System.out.print("실행할 작업을 선택하세요.");
					sc = new Scanner(System.in);
					switch(sc.nextInt()){
					case 1 : result = newSungJuk(); break;
					case 2 : result = readSungJuk(); break;
					case 3 : result = readOneSungJuk() ; break;
					case 4 : result = modifySungJuk() ; break;
					case 5 : result = removeSungJuk() ; break;
					case 0 : sc.close();System.exit(0); break;
					default : result = "잘못 입력하셨습니다.";
					}
		System.out.println(result);
		  }  // while
		
	} // public static void main

	// 성적 데이터 입력
	public static String newSungJuk() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		String result = "";
		String sql = " insert into sungjuk  (sjno,name,kor,eng,mat,tot,avgs,grd) values(sjno.nextval,?,?,?,?,?,?,?)";
		Scanner sc = new Scanner(System.in);

		System.out.println("성적 데이터를 입력합니다.");
		System.out.println("이름, 국어, 영어, 수학 순으로 입력하세요");
		SungJuk2VO sj = new SungJuk2VO(sc.next(), sc.nextInt(), sc.nextInt(),
				sc.nextInt());

		// 총점, 평균, 학점 계산
		computeSungJuk(sj);

		// SungJuk 테이블에 데이터 입력
		try {
			Class.forName(DRV);
			conn = DriverManager.getConnection(URL, USR, PWD);
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, sj.getName());
			pstmt.setInt(2, sj.getKor());
			pstmt.setInt(3, sj.getEng());
			pstmt.setInt(4, sj.getMat());
			pstmt.setInt(5, sj.getTot());
			pstmt.setDouble(6, sj.getAvg());
			pstmt.setString(7, String.valueOf(sj.getGrd()));
			int cnt = pstmt.executeUpdate();

			if (cnt > 0)
				result = cnt + "건의 데이터가 입력 됨.";

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (pstmt != null)
				try {
					pstmt.close();
				} catch (Exception e) {
				} finally {
				}
			if (conn != null)
				try {
					conn.close();
				} catch (Exception e) {
				} finally {
				}
		}

		return result;
	} // newSungJuk

	// 성적 데이터 전체조회
	public static String readSungJuk() {
		StringBuilder sb = new StringBuilder();
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null; // select 문 실행 시
		String sql = "select * from sungjuk order by sjno";

		System.out.println("전체 성적 데이터를 출력합니다.");
		try {
			Class.forName(DRV);
			conn = DriverManager.getConnection(URL, USR, PWD);
			pstmt = conn.prepareStatement(sql);
			rs = pstmt.executeQuery();
			sb.append("==============================").append("\n");
			while (rs.next()) {
				sb.append(rs.getString(1)).append("/").append(rs.getString(2))
						.append("/").append(rs.getString(3)).append("/")
						.append(rs.getString(4)).append("/")
						.append(rs.getString(5)).append("/")
						.append(rs.getString(6)).append("/")
						.append(rs.getString(7)).append("/")
						.append(rs.getString(8)).append("/")
						.append(rs.getString(9)).append("\n");
			} // while

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (rs != null)
				try {
					rs.close();
				} catch (Exception e) {
				} finally {
				}
			if (pstmt != null)
				try {
					pstmt.close();
				} catch (Exception e) {
				} finally {
				}
			if (conn != null)
				try {
					conn.close();
				} catch (Exception e) {
				} finally {
				}
		}

		return sb.toString();
	}

	// 성적 데이터 검색
	public static String readOneSungJuk() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = "select * from sungjuk where name = ? order by sjno";
		StringBuilder sb = new StringBuilder();
		Scanner sc = new Scanner(System.in);

		System.out.println("이름으로 성적 데이터를 조회합니다.");
		System.out.println("조회할 성적데이터의 이름을 입력하세요.");
		String name = sc.next();
		try {
			Class.forName(DRV);
			conn = DriverManager.getConnection(URL, USR, PWD);
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, name);
			rs = pstmt.executeQuery();
			sb.append("==============================").append("\n");

			while (rs.next()) {
				sb.append(rs.getString(1)).append("/").append(rs.getString(2))
						.append("/").append(rs.getString(3)).append("/")
						.append(rs.getString(4)).append("/")
						.append(rs.getString(5)).append("/")
						.append(rs.getString(6)).append("/")
						.append(rs.getString(7)).append("/")
						.append(rs.getString(8)).append("/")
						.append(rs.getString(9)).append("\n");
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (rs != null)
				try {
					rs.close();
				} catch (Exception e) {
				} finally {
				}
			if (pstmt != null)
				try {
					pstmt.close();
				} catch (Exception e) {
				} finally {
				}
			if (conn != null)
				try {
					conn.close();
				} catch (Exception e) {
				} finally {
				}
		}

		return sb.toString();
	}

	// 성적 데이터 수정
	public static String modifySungJuk() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		String sql = " update sungjuk set name=?, kor=?,eng=?,mat=?,tot=?,avgs=?,grd=?, regdate=sysdate where name=? ";

		Scanner sc = new Scanner(System.in);
		String result = "";
		System.out.println("선택한 성적 데이터를 수정합니다.");
		System.out.println("수정할 성적 데이터의 이름을 입력하세요.");
		String name = sc.next();		
		System.out.println("이름, 국어, 영어, 수학 순으로 입력하세요.");
		SungJuk2VO sj = new SungJuk2VO(sc.next(), sc.nextInt(), sc.nextInt(),
				                           sc.nextInt());
		
		computeSungJuk(sj);		
		
		 try {
			Class.forName(DRV);
			conn = DriverManager.getConnection(URL,USR,PWD);
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, sj.getName());
			pstmt.setInt(2, sj.getKor());
			pstmt.setInt(3, sj.getEng());
			pstmt.setInt(4, sj.getMat());
			pstmt.setInt(5, sj.getTot());
			pstmt.setDouble(6, sj.getAvg());
			pstmt.setString(7, String.valueOf(sj.getGrd()));
			pstmt.setString(8, name);
			
			int cnt = pstmt.executeUpdate();
			if(cnt>0)result=cnt+"건의 데이터가 수정되었습니다.";
			
		 } catch (Exception e) {
				e.printStackTrace();
			} finally {
				if (pstmt != null)	try {pstmt.close();} catch (Exception e) {} finally {	}				;
				if (conn != null)	try {	conn.close();} catch (Exception e) {	} finally {		}
			}
		
		return result;
	}

	// 성적 데이터 삭제
	public static String removeSungJuk() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		String sql = "delete from sungjuk where name = ?";

		Scanner sc = new Scanner(System.in);
		System.out.println("선택한 성적 데이터를 삭제합니다.");
		System.out.println("삭제할 성적 데이터의 이름을 입력하세요.");
		String name = sc.next();
		try {
			Class.forName(DRV);
			conn = DriverManager.getConnection(URL, USR, PWD);
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, name);
			int cnt = pstmt.executeUpdate();

			if (cnt > 0)
				System.out.println(cnt + "건의 데이터가 삭제되었습니다.");

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (pstmt != null)
				try {
					pstmt.close();
				} catch (Exception e2) {
				} finally {
				}
			;
			if (conn != null)
				try {
					conn.close();
				} catch (Exception e2) {
				} finally {
				}
		}


		String result = "";
		return result;
	}

	// 성적 데이터 계산
	public static void computeSungJuk(SungJuk2VO sj) {
		String dfmt = "###.##";

		sj.setTot(sj.getKor() + sj.getEng() + sj.getMat());
		DecimalFormat df = new DecimalFormat(dfmt);
		String avg = df.format((double) sj.getTot() / 3);
		sj.setAvg(Double.parseDouble(avg));
		switch ((int) sj.getAvg() / 10) {
		case 10:
		case 9:
			sj.setGrd('수');
			break;
		case 8:
			sj.setGrd('우');
			break;
		case 7:
			sj.setGrd('미');
			break;
		case 6:
			sj.setGrd('양');
			break;
		default:
			sj.setGrd('가');
		}
	} // computeSungJuk
} // public class J20SungJuk
